from tortoise import fields, models
from tortoise.contrib.pydantic import pydantic_model_creator


class FileModel(models.Model):
    """
    文件模型，用于存储上传文件的元数据
    """
    id = fields.IntField(pk=True, description="文件ID")
    
    filename = fields.CharField(max_length=255, description="原始文件名")
    
    # 存储在服务器上的文件名，可以是UUID或者哈希值，避免重名和安全问题
    saved_filename = fields.CharField(max_length=255, unique=True, description="存储文件名")
    
    # 文件的相对存储路径，不包含文件名
    path = fields.CharField(max_length=500, description="文件相对路径")
    
    # 完整的文件访问URL，可由 path 和 saved_filename 动态生成
    # 为了灵活性，我们也可以直接存储
    url = fields.CharField(max_length=1000, description="文件访问URL")
    
    size = fields.IntField(description="文件大小（字节）")
    
    # 新增字段：文件内容的哈希值，用于判断文件唯一性
    hash = fields.CharField(max_length=128, null=True, index=True, description="文件哈希值(MD5/SHA256)")
    
    mime_type = fields.CharField(max_length=100, description="文件MIME类型")
    
    # 文件上传者，与用户模型关联
    uploader = fields.ForeignKeyField(
        "models.UserModel", related_name="uploaded_files", on_delete=fields.SET_NULL, null=True, description="上传者"
    )
    
    created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
    updated_at = fields.DatetimeField(auto_now=True, description="更新时间")

    class Meta:
        table = "files"
        table_description = "文件存储表"
        ordering = ["-created_at"]

    def __str__(self):
        return self.filename


# Pydantic序列化器
File_Pydantic = pydantic_model_creator(FileModel)
FileIn_Pydantic = pydantic_model_creator(FileModel, name="FileIn", exclude_readonly=True) 